// const PENDING = 'pending';
// const FULFILLED = 'fulfilled';
// const REJECTED = 'rejected';

// // 这个很简单，我也是能够写出来的
// function _Promise(eresultecutor) {
//     const _this = this;
//     this.status = PENDING; //状态
//     this.value = undefined; //成功结果
//     this.reason = undefined; //失败原因
//     this.onFulfilled = [];
//     this.onRejected = [];
//     function resolve(value) {
//         if (_this.status === PENDING) {
//             _this.status = FULFILLED;
//             _this.value = value;
//             _this.onFulfilled.forEach((fn) => fn(value));
//         }
//     }
//     function reject(reason) {
//         if (_this.status === PENDING) {
//             _this.status = REJECTED;
//             _this.reason = reason;
//             _this.onRejected.forEach((fn) => fn(reason));
//         }
//     }
//     try {
//         eresultecutor(resolve, reject);
//     } catch (error) {
//         reject(error);
//     }
// }

// _Promise.prototype.then = function (onFulfilled, onRejected) {
//     const _this = this;
//     // 检查是不是function，如果不是，就给个默认函数
//     if (typeof onFulfilled !== 'function') onFulfilled = (value) => value;
//     if (typeof onRejected !== 'function')
//         onRejected = (reason) => {
//             throw reason;
//         };

//     // 这里不能直接返回Promise2
//     const Promise2 = new _Promise((resolve, reject) => {
//         /* 状态已经完成了，比如这种直接返回的情况
//             Promise((resolve, reject) => {
//                 resolve(3);
//             }).then();
//         */
//         if (_this.status === FULFILLED) {
//             // 虽然已经成功了，但是也不能直接返回值，要通过异步的方式返回值（原生Promise就是这样的）
//             setTimeout(() => {
//                 try {
//                     // 执行成功的回调函数
//                     let result = onFulfilled(_this.value);
//                     resolve_Promise(Promise2, result, resolve, reject);
//                 } catch (error) {
//                     reject(error);
//                 }
//             });
//         } else if (_this.status === REJECTED) {
//             setTimeout(() => {
//                 try {
//                     let result = onRejected(_this.reason);
//                     resolve_Promise(Promise2, result, resolve, reject);
//                 } catch (error) {
//                     reject(error);
//                 }
//             });
//         } else {
//             /*  pending的情况，比如Promise里面有个异步函数正在处理
//                 这种情况，只能先把成功/失败回调函数压入到resolve/reject里面
//                 等异步函数执行的时候，会调用Resolve或者reject，再执行压入到队列的这些异步函数
//             */
//             _this.onFulfilled.push(() => {
//                 setTimeout(() => {
//                     try {
//                         let result = onFulfilled(_this.value);
//                         resolve_Promise(Promise2, result, resolve, reject);
//                     } catch (error) {
//                         reject(error);
//                     }
//                 });
//             });
//             _this.onRejected.push(() => {
//                 setTimeout(() => {
//                     try {
//                         let result = onRejected(_this.reason);
//                         resolve_Promise(Promise2, result, resolve, reject);
//                     } catch (error) {
//                         reject(error);
//                     }
//                 });
//             });
//         }
//     });
//     return Promise2;
// };
// /**
//  *
//  * @param {_Promise} Promise2 传入Promise2，这里的Promise2已经初始化了
//  * @param {any} result 成功或者失败的结果
//  * @param {Function} resolve Promise2的resolve方法
//  * @param {Function} reject Promise2的reject方法
//  * @returns
//  */
// function resolve_Promise(Promise2, result, resolve, reject) {
//     // 链式循环？
//     if (Promise2 === result) {
//         reject(new TypeError('Chaining cycle'));
//     }
//     // 如果result是个Promise的话
//     if ((result && typeof result === 'object') || typeof result === 'function') {
//         try {
//             if (typeof result?.then === 'function') {
//                 // 这个套娃处理有点难了
//                 result.then(
//                     (y) => {
//                         resolve_Promise(Promise2, y, resolve, reject);
//                     },
//                     (r) => {
//                         reject(r);
//                     }
//                 );
//             } else {
//                 // 可能只是一般普通对象
//                 resolve(result);
//             }
//         } catch (e) {
//             reject(e);
//         }
//     } else {
//         // 否则，就直接返回结果
//         resolve(result);
//     }
// }

// _Promise.prototype.catch = function (onRejected) {
//     return this.then(undefined, onRejected);
// };

// // const p = new _Promise(function (resolve, reject) {
// //     console.log('执行');
// //     resolve(2);
// //     // reject(2);
// //     // setTimeout(function () {
// //     //     resolve(2);
// //     // }, 1000);
// // });
// // // console.log(p);
// // p.then(
// //     function (res) {
// //         console.log('suc', res);
// //         return 4;
// //         // return new _Promise(function (resolve, reject) {
// //         //     console.log('执行');
// //         //     // resolve(2);
// //         //     setTimeout(function () {
// //         //         resolve(6);
// //         //     }, 1000);
// //         // });
// //     },
// //     function (err) {
// //         console.log('err1', err);
// //     }
// // )
// // .then((res) => {
// //     console.log('last', res);
// //     throw 'nmsl';
// // });
// // // .catch((err) => {
// // //     console.log('err2', err);
// // // });
// // console.log('输出');

// var p1 = new _Promise((resolve, reject) => {
//     resolve('p1');
// });
// p1.then((res) => {
//     console.log(res);
//     return new _Promise((resolve, reject) => {
//         setTimeout(() => {
//             // console.log('?')
//             resolve(res + '2');
//         }, 1000);
//     });

//     // return new Promise((resolve, reject) => {
//     //     resolve(
//     //         new Promise((resolve, reject) => {
//     //             resolve('p2');
//     //         })
//     //     );
//     // });
// }).then((res1) => {
//     //Promise {state: "fulfilled", value: "p2"}
//     console.log(res1);
// });
